通过赋值传递:Python
我想了解以下代码变体:通过赋值传递:Python,python,pass-by-reference,variable-assignment,Python,Pass By Reference,Variable Assignment,我想了解以下代码变体: a = [1, 2, 3] b = a b.append(4) b = ['a', 'b'] print(a, b) 我所理解的是,变量a指的是一个对象,它在内存中的某个位置包含列表[1,2,3],而b现在指的是a所指的同一个对象,通过这个链接,我们在技术上附加在a而不是b中 输出:[1,2,3,4][a',b'] 我对代码进行了一些更新: a = [1, 2, 3] b = ['a', 'b'] b = a b.append(4) print(a, b) 我的理解是
a = [1, 2, 3]
b = a
b.append(4)
b = ['a', 'b']
print(a, b)
我所理解的是,变量
a
指的是一个对象,它在内存中的某个位置包含列表[1,2,3]
,而b
现在指的是a
所指的同一个对象,通过这个链接,我们在技术上附加在a而不是b中
输出:[1,2,3,4][a',b']
我对代码进行了一些更新:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
print(a, b)
我的理解是:b现在指的是两个对象,第一个列表['a','b']
,第二个列表(a最初指的是a
)通过第三行b=a
输出:[1,2,3,4][1,2,3,4]
最后代码变化:
a = [1, 2, 3]
b = ['a', 'b']
b = a
b.append(4)
a.append(10)
print(a, b)
根据我到目前为止的理解,我认为第3行
b=a
上的链接只提供了b
引用多个对象(它自己和a
)的能力,而a
应该只引用一个对象[1,2,3]
,因此预期的输出应该是:[1,2,3,4,10][1,2,3,4]
实际输出:[1,2,3,4,10][1,2,3,4,10]
那么,第3行b=a
上的作业是否像双向链接?其中,a
创建了对b
对象的引用
如果我错了,我希望有人能帮我澄清这一困惑,纠正我的想法。
多谢各位
我的理解是:b现在指的是两个对象
这是不对的。名称不能同时与给定范围内的多个对象关联
b=a
将b
与a
关联的对象相关联。执行该行后,将不会有任何内容引用['a','b']
,该列表应该可以进行垃圾收集,因为它不能再使用了。不要将对象看作指针,我认为这是您困惑的根源。不是“b指向a”或“a指向b”,而是与绑定到对象有关。我认为查看id
会很有用
>>> a = [1, 2, 3]
>>> id(a)
1833964774216
>>> b = a
>>> id(b)
1833964774216
在这种情况下,a
和b
都绑定到该列表。因此,对list1833964774216
的任何变异都将反映在这两个对象中。但我可以重新分配(或绑定)到一个完全不同的对象
>>> b = [4, 5, 6]
>>> id(b)
1833965089992
>>> b
[4, 5, 6]
这对a
没有任何影响,因为它仍然绑定到原始列表
>>> a
[1, 2, 3]
>>> id(a)
1833964774216
让我们了解名称和对象之间的区别。在您的例子中,a和b是名称,分配给a和b的列表“[1,2,3]”就是对象。最初a=[1,2,3],在a分配给b之后,即b=a,在这种情况下,a和b都绑定到同一个列表对象。这意味着您可以使用名称a或b更改该列表对象的值 这可以通过将分配给a的列表复制到b来克服 b=a.复制()
这将创建分配给b的同一对象的副本变量a和变量b引用同一列表。如果更改其中一个,另一个也会收到这些更改。如果你想复制一个列表,请使用new_list=list.copy()这也可能有帮助:你为什么把它弄得这么复杂?在
b=a
之后,a
和b
是同一个对象,仅此而已。“从技术上讲,我们是在a而不是b中追加的。”不。变量指的是对象。这两个变量都引用同一个对象,并附加到该对象。您不需要附加到变量。“我的理解是:b现在指的是两个对象”好吧,不是同时。它一开始指的是一个对象,后来指的是另一个对象。阅读以下内容:注意,这与“通过赋值传递”无关,后者指的是一种求值策略,它与函数参数的求值方式和求值时间有关,而不是像这样的简单赋值。“根据我到目前为止的理解,我认为第3行b=a上的链接只给了b引用多个对象(它自己的和a的)的能力,而a”不。变量一次只能引用一个对象。我认为这让你感到困惑。