for循环中的Python分配(理论澄清)

我需要弄清楚这里发生了什么,真正的原因是什么:


array = [0, 1, 2]

for element in array:

    element += 1


print array #CHANGES NOTHING


double_array = [[0,1], [2,3]]

for element in double_array:

    element[0] = "Changed!"


print double_array #THIS WORKS


for element in double_array:

    element = ["Doesn't work!"]


print double_array #NOPE

我很直观地理解这一点,但是我不确定其背后的理论。我的感觉是,python中的变量名是这种空灵的东西,如果直接在其后加上“ =”,它会立即崩溃。如果变量引用列表,则可以在其后使用“ .append”,也可以在其后使用“ [0] =“,它的作用类似于C中的引用,但是如果直接为其分配内容,则python就像,“哦,您不再需要此名称了吗?好吧,现在它仅指代您分配给它的东西,而没有别的东西了”。


特别是,对于我的第一个案例,“整数是不可变的”对我来说似乎是错误的。在我的第三种情况下,列表似乎与整数一样不可变。对此的正确解释是什么?


Smart猫小萌
浏览 196回答 2
2回答

温温酱

在Python中,每一个变量,数组元素和属性是一个参考,而唯一的东西=,+=,-=等有能力做的是改变什么了左侧指。请注意,任何其他操作都将直接作用于所引用的值,例如.((左侧引用的对象的查找属性)或[](由左侧引用的list / dict的查找元素)左手边)。如果您想用C来理解Python,请记住以下几点:在Python中,没有诸如原始数据类型或原始类型的变量之类的东西赋值始终会影响变量所指的内容,就像在C中赋值给指针一样任何其他操作都会使用和/或影响参考值,因此您可以将其视为自动取消参考。特别是a.b对应于a->b或(*a).b。

蝴蝶不菲

在第一种情况下,pyhton为列表中的每个值创建一个新变量,并且不对变量应用旧引用。但是在第二种情况下,python会为列表整体创建一个新变量,但不会为每个变量生成一个新变量。因此,列表中元素的引用保持不变并更改了该特定元素。在第三种情况下,它会像第二种情况一样创建一个变量,并整体上更改变量,但不会更改每个元素的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python