def fun(m):
i=0
for _ in range(0,len(m)):
m[_]=m[_]//2
return m
list=[1,3,6] #User input long value or small value
x=fun(list[:])
print(x)
我的问题是:如果代码成为用户输入列表值代码的resule是不是可以肯定?
因为你可以看到 Python: two objects are the same
>>> a = 4534534
>>> b = a
>>> a is b
True
>>> b = 4534534
>>> a is b
False
>>> a = 1
>>> b = a
>>> a is b
True
>>> b = 1
>>> a is b
True
答案 0 :(得分:1)
我不确定我是否正确地阅读了你的问题。对不起。但是你的代码在Python中显示出令人惊讶的东西。这是相当期待的:
>>> a = 4534534
>>> b = 4534534
>>> a is b
False
Python创建了两个独立的对象。这就是Python通常的工作方式。
>>> a = 1
>>> b = 1
>>> a is b
True
什么?好吧,因为优化Python从池中共享小整数,所以它们将具有相同的id。
这是你想问的问题吗?
如果你写:
m = list[:]
制作一份浅表的清单并分配给m。列表的对象id将是不同的,而内容的对象id将是相同的。您的列表包含整数,这些整数是不可变的,因此无法通过引用列表副本来更改原始列表中的值。但是,当列表包含可变值(例如对象,dicts或甚至其他列表)时,对列表中共享可变项的修改将反映在原始列表中。
//运算符会将结果向下舍入为最接近的整数。虽然保留了类型,但如果其中一个参数是float,则结果将为float。
a[0] is b[0]
当对象相同时, is
返回True,这意味着id(思考指针)是相同的。当对象不同时返回False。当id不同时,值可能相同也可能不同。如果要测试值是否相同(更常见),请使用==。
答案 1 :(得分:1)
我认为您在询问是否可以保证list
(您的变量)在运行fun(list[:])
时不会被更改。
由于int
是python中的不可变类型,因此您完全安全。 Cpython使用的小整数(范围从-5到256)的实际内容在这里没有任何改变 - 即使您使用m[_] //= 2
编码它仍然可以,因为它隐式地创建了对整数的新引用将其存储在复制列表中(不是原始列表)。
作为旁注,list
是变量的错误名称。你正在隐藏内置列表类型。