在提问之前,我阅读了“如何通过引用传递变量?”问题的公认答案,以及在同一个答案中链接的文档:“如何用输出参数编写函数(通过引用调用)?”
我有一个相关的问题: Python是否自动同步其值为对另一个对象的引用的变量?换句话说,如果我将一个对象赋值为变量的值,那么每当对象被修改时,该变量是否被更新?
我有一个特定的问题,即Python似乎用对象作为其值更新变量的值,而没有任何代码显式地触发更新。我创建了一个函数,它应该是ROT13 (旋转13次)问题的解决方案的一部分:将数组移到右边13次。下面是函数的代码:
array = [0, 1, 2, 3, 4, 5]
print(array)
backup = array
#backup = [n for n in array]
for i in range( 1, (len(backup)) ):
array[i] = backup[i - 1]
array[0] = backup[-1]
backup = array
print(array)
该代码的输出是错误的:[0, 0, 0, 0, 0, 0]
。但是,当我将第3行(backup = array
)替换为backup = [n for n in array]
时,答案是正确的:[5, 0, 1, 2, 3, 4]
我推断,每当执行for-循环时,backup
的值就会被更新,因为它的值本质上是对对象array
的引用。在我看来,当array[1]
被赋值为零时,backup[1]
也被分配为零,而不是保存值1。因此,for-循环简单地将值零赋值给backup
thru array
中的每个其他变量。
如果我将备份分配给与使用array
的backup = [n for n in array]
不同的list对象,那么修改array
不会修改backup
。
造成这种行为的实际原因是什么?
发布于 2019-12-11 19:10:57
在您的示例中,backup
和array
都是对同一个对象的引用。下面的代码示例说明了这一点:
>>> array=[1,2,3,4]
>>> backup=array
>>> id(array)
4492535840
>>> id(backup)
4492535840
因此,您的代码相当于以下内容:
array = [0, 1, 2, 3, 4, 5]
print(array)
for i in range( 1, (len(array)) ):
array[i] = array[i - 1]
array[0] = array[-1]
print(array)
这有用吗?
发布于 2019-12-11 19:13:03
没有同步。相反,只有一份名单。两个变量都引用相同的列表--如果这有帮助的话,您可以将这些变量视为指向它的变量或贴上标签。您对值执行操作,而不是对变量执行操作,因此,考虑到只有一个列表,所有操作都会更改它并从相同的列表中读取更改。
https://stackoverflow.com/questions/59297148
复制