Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过赋值传递:Python_Python_Pass By Reference_Variable Assignment - Fatal编程技术网

通过赋值传递: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
都绑定到该列表。因此,对list
1833964774216
的任何变异都将反映在这两个对象中。但我可以重新分配(或绑定)到一个完全不同的对象

>>> 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”不。变量一次只能引用一个对象。我认为这让你感到困惑。