-1
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)

我的问题是:如果代码成为用户输入的列表值,代码的结果是不确定的?

因为你可以看到 Python:两个对象是一样的

>>> 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
4

2 回答 2

1

我不确定我是否正确阅读了您的问题。对此感到抱歉。但是您的代码在 Python 中显示出一些令人惊讶的东西。这是相当预期的:

>>> a = 4534534
>>> b = 4534534
>>> a is b
False

Python 创建了两个独立的对象。这就是 Python 通常的工作方式。

>>> a = 1
>>> b = 1
>>> a is b
True

什么?好吧,作为一种优化,Python 共享池中的小整数,因此它们将具有相同的 id。

这就是你想问的吗?

如果你写:

m = list[:]

制作 list 的浅表副本并将其分配给 m。列表的对象 ID 将不同,而内容的对象 ID 将相同。您的列表包含整数,它们是不可变的,因此原始列表中的值不能通过引用列表的副本来更改。但是,当列表包含可变值(例如对象、字典或什至其他列表)时,对列表中共享可变项的修改将反映在原始列表中。

// 运算符使结果向下舍入到最接近的整数。但是类型是保持不变的,所以如果参数之一是浮点数,结果将是浮点数。

这取决于你的定义是什么

a[0] is b[0]

is当对象相同时返回 True,这意味着 id(认为指针)相同。当对象不同时返回 False。当 id 不同时,这些可能相同也可能不同。如果您想测试值是否相同(这更常见),请使用 ==。

祝你好运,我希望这会有所帮助。

于 2012-11-24T06:03:05.160 回答
1

我想您是在问是否可以保证list(您的变量)在您运行时不会被更改fun(list[:])

由于int是 python 中的不可变类型,因此您是完全安全的。Cpython 使用的小整数(范围从 -5 到 256)的实习在这里不会改变任何东西——即使你使用的代码m[_] //= 2仍然可以,因为它隐式地创建了一个对整数的新引用并将其存储在你复制的清单(不是原件)。

作为旁注list是变量的坏名称。您正在隐藏内置列表类型。

于 2012-11-24T06:03:28.887 回答