首先,这是我的代码:
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之前的行?
答案 0 :(得分:2)
这是因为您为变量分配了顺序。以前,你说过:
total = [ [A, aP], [B, bP] , [C, cP] , [D, dP] , [E, eP] ]
当您分配此变量时,aP, bP, cP, dP
和eP
的值均为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 的关系。