列表外的变量更新,但不在内部

时间:2015-10-26 16:30:56

标签: python loops for-loop

首先,这是我的代码:

A = "A"
B = "B"
C = "C"
D = "D"
E = "E"

aN = 1
bN = 2
cN = 3
dN = 4
eN = 5

aP = 0
bP = 0
cP = 0
dP = 0
eP = 0

tempList = [ [A, aN], [B, bN] , [C, cN] , [D, dN] , [E, eN] ]
total = [ [A, aP], [B, bP] , [C, cP] , [D, dP] , [E, eP] ]

x = 0
for y in tempList:
    if tempList[x][1] == aN or tempList[x][1] == bN:
        aP = aP + 1
        x = x + 1
        print("yes")
        print(aP)
        print(total)

这是输出的内容:

yes
1
[['A', 0], ['B', 0], ['C', 0], ['D', 0], ['E', 0]]
yes
2
[['A', 0], ['B', 0], ['C', 0], ['D', 0], ['E', 0]]

每当打印总数时,为什么aP返回0,而在返回为1或2之前的行?

2 个答案:

答案 0 :(得分:2)

这是因为您为变量分配了顺序。以前,你说过:

total = [ [A, aP], [B, bP] , [C, cP] , [D, dP] , [E, eP] ]

当您分配此变量时,aP, bP, cP, dPeP的值均为0.这会得出结果:

[['A', 0], ['B', 0], ['C', 0], ['D', 0], ['E', 0]]

当你在循环中打印时,你会看到的是什么。

现在您稍后更改aP的值。但是,这并不会更改aP变量中total的值,因为您已经分配了它!总值将始终为:

[['A', 0], ['B', 0], ['C', 0], ['D', 0], ['E', 0]]

直到您真正进入并更改total变量。

尝试用以下代码替换循环的最后几行:

print("yes")
print(aP)
total = [ [A, aP], [B, bP] , [C, cP] , [D, dP] , [E, eP] ]
print(total)

看看你是否得到了理想的结果。

答案 1 :(得分:2)

Python通过 value 复制,而不是通过引用复制。这意味着,当你写了

tempList = [ [A, aN], [B, bN] , [C, cN] , [D, dN] , [E, eN] ]  
total = [ [A, aP], [B, bP] , [C, cP] , [D, dP] , [E, eP] ]  

你告诉Python"将A的值放入总[0] [0],将aP的值放入总[0] [1],并且......"等等,而不是"将total [0] [0]视为对A的引用,当我写入total [0] [0](和写入A时的总[0] [0]时更新A,也是!),并将total [0] [1]视为Ap ..."等

Python并没有真正做到这一点。有很多方法,通过创建自定义类或通过(ab)使用序列对象作为变量,如下所示:

>>> x = [1234]
>>> y = x
>>> print "y = " + str(y)
y = [1234]

您在这里所做的就是说,"创建一个列表。当我说' x'时,请参阅该列表。"然后,你说,"当我说' y时,请参阅此列表"然后你将y指向与你指向x相同的列表。请注意,您在x处执行指向y,您将y指向x所指向的内存中的同一对象(列表对象)。现在,您可以通过使用变量名称引用它们来摆弄列表中的值:

>>> x[0] = 4321
>>> print "y = " + str(y)
y = [4321]

同样,y和x指的是一个共同的对象,一个列表。我可以"重新定位" x到另一个列表,并断开x与y的任何关联:

>>> x = [5555]
>>> print "x = " + str(x)
x = [5555]
>>> print "y = " + str(y)
y = [4321]

现在,内存中有两个列表,x指的是其中一个,y指向另一个。 x和y彼此之间有 no 的关系。