python中变量定义的意外行为[重复]

Posted

技术标签:

【中文标题】python中变量定义的意外行为[重复]【英文标题】:unexpected behaviour with variables definition in python [duplicate] 【发布时间】:2012-12-23 08:43:38 【问题描述】:

可能重复:Variable assignment and modification (in python)

我刚刚注意到 python 中的变量赋值有一些我没想到的行为。例如:

import numpy as np
A = np.zeros([1, 3])
B = A

for ind in range(A.shape[1]):
    A[:, ind] = ind
    B[:, ind] = 2 * ind
print 'A = ', A
print 'B = ', B

输出

A = [[ 0. 2. 4.]]

B = [[ 0. 2. 4.]]

在我期待的时候:

A = [[ 0. 1. 2.]]

B = [[ 0. 2. 4.]]

如果我将“B = A”替换为“B = np.zeros([1, 3])”,那么我做对了。 我无法在 Ipython 终端中重现意外结果。我在 SciTE 3.1.0 中使用 F5 键运行代码得到了该结果。我在 Win7 中使用 Python(x, y) 2.7.2.3 发行版。

【问题讨论】:

【参考方案1】:
B = A

使AB 指向同一个对象。这就是为什么它们会同时更改。

使用

B = A.copy()

它会按预期工作。

【讨论】:

【参考方案2】:

在您的代码中,B 只是 A 的另一个名称,因此当您更改一个时,您将更改另一个。这是 Python 中可变对象的常见“问题”。使用 numpy 数组,您可以使用 copy() 函数。

但是,可变容器(例如列表或字典)也会发生这种情况。为避免这种情况,您可以选择以下之一:(取决于可变的复杂性)

B = A[:]  #makes a copy of only the first level of the mutable
B = copy(A)  #same as above, returns a 'shallow copy' of A
B = deepcopy(A)  #copies every element in the mutable, on every level

请注意,要使用copydeepcopy 函数,您需要从标准模块copy 中导入它们。

另请参阅:this question

【讨论】:

好吧,为什么我不能在Ipython终端复制它? 因为你不需要复制?我不完全确定 - 有人在这里标记? @user1850133:它在 IPython 终端中的行为应该完全相同。也许如果您展示 IPython 会话的记录,我们将能够看到正在发生的事情。 @Volatility: "复制和深复制方法" -> "复制和深复制函数" @MarkDickinson 是的,抱歉,已修复

以上是关于python中变量定义的意外行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

指针的意外行为(操作时)但使用双指针时定义的行为

函数定义中的Python变量范围[重复]

python中用于定义全局变量的空等效项[重复]

在Python中定义类变量的正确方法[重复]

C#中子字符串的意外行为[重复]

如何在Python中定义静态变量