Python for循环中的Python变量赋值

Mic*_*hal 4 python variables loops

据我所知,在Python中,常规的c ++样式变量赋值被替换为对东西的引用即

a=[1,2,3]
b=a
a.append(4)
print(b)       #gives [1,2,3,4]
print(a)       #gives [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

但我仍然困惑为什么与基本类型的类似情况,例如.整数的工作方式不同?

a=1
b=a
a+=1
print(b)          # gives 1
print(a)          # gives 2
Run Code Online (Sandbox Code Playgroud)

但等等,当我们考虑循环时,它会变得更加混乱!

li=[1,2,3]
for x in li:
    x+=1
print(li)     #gives [1,2,3]
Run Code Online (Sandbox Code Playgroud)

这是我的预期,但如果我们这样做会发生什么:

a,b,c=1,2,3
li=[a,b,c]
for x in li:
    x+=1
print(li)        #gives [1,2,3]
Run Code Online (Sandbox Code Playgroud)

也许我的问题应该是如何遍历整数列表并在没有map()的情况下更改它们,因为我需要一个if语句.我唯一能做的就是没用

for x in range(len(li)):
    Do stuff to li[x]
Run Code Online (Sandbox Code Playgroud)

将整数打包在一个元素列表中.但必须有更好的方法.

chi*_*nuy 6

好吧,你需要考虑可变不可变的类型.

对于列表,它是可变的.对于整数,它是不可变的,这意味着如果更改它将引用新对象.当一个执行+ = 1,一个将被分配一个新对象,但b仍指代相同的一个.


glg*_*lgl 5

a=[1,2,3]
b=a
a.append(4)
print(b)       #[1,2,3,4]
print(a)       #[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

在这里您要修改列表.列表内容会更改,但列表标识仍然存在.

a=1
b=a
a+=1
Run Code Online (Sandbox Code Playgroud)

然而,这是一个重新分配.您指定了另一个对象a.

请注意,如果您a += [4]在第一个示例中执行了操作,则会看到相同的结果.这来自a += something同样的事实,如果不存在则a = a.__iadd__(something)回退.a = a.__add__(something)__iadd__()

不同之处在于__iadd__(),通过修改它所处理的对象并返回它来尝试"就地"完成它的工作.所以a指的是和以前一样.这仅适用于列表等可变对象.

在诸如int之类的不可变对象上__add__()被调用.它返回一个不同的对象,导致a指向另一个对象.没有其他选择,因为整数是不可改变的.


a,b,c=1,2,3
li=[a,b,c]
for x in li:
    x+=1
print(li)        #[1,2,3]
Run Code Online (Sandbox Code Playgroud)

x += 1意味着相同x = x + 1.它改变了x引用的位置,但不改变列表内容.

也许我的问题应该是如何遍历整数列表并在没有> map()的情况下更改它们,因为我需要一个if语句.

for i, x in enumerate(li):
    li[i] = x + 1
Run Code Online (Sandbox Code Playgroud)

为每个列表位置分配旧值+ 1.