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)
将整数打包在一个元素列表中.但必须有更好的方法.
好吧,你需要考虑可变和不可变的类型.
对于列表,它是可变的.对于整数,它是不可变的,这意味着如果更改它将引用新对象.当一个执行+ = 1,一个将被分配一个新对象,但b仍指代相同的一个.
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.
| 归档时间: |
|
| 查看次数: |
12055 次 |
| 最近记录: |