使用列表[:]和用户输入短小整数。代码的结果无法确定

时间:2012-11-24 05:46:39

标签: python python-3.x python-2.7

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

2 个答案:

答案 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是变量的错误名称。你正在隐藏内置列表类型。