【问题标题】:Are slice objects mutable in function declaration?切片对象在函数声明中是可变的吗?
【发布时间】:2015-08-24 02:16:28
【问题描述】:

在了解了default arguments work 如何在 python 中使用后,我检查了所有代码以查找使用可变序列时可能出现的错误。

现在我有一个函数,其签名是:

def get_measurements(self, shape = slice(None, None, None), 
                     size = slice(None, None, None), 
                     height = slice(None, None, None), 
                     pressure = slice(None, None, None),  
                     LE = slice(None, None, None),                          
                     fname = None)

我现在想知道,切片对象是可变的吗?在上述情况下,这是否会导致默认值出现问题?

【问题讨论】:

  • 你为什么不尝试分配他们的属性并找出答案?
  • @jonrsharpe “程序测试可以用来显示错误的存在,但永远不能显示它们不存在!” - E.W. Dijkstra
  • “谁在乎 Dijkstra 说什么,你只想知道 slice 对象是否可变” - 我,就在现在
  • 如果它们是,那不一定是问题,除非get_measurements() 中的某些代码实际上改变了它们。

标签: python default-value mutable


【解决方案1】:

slice 对象是不可变的。

>>> s = slice(None)
>>> s
slice(None, None, None)
>>> s.start = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
>>> s.stop = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
>>> s.step = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: readonly attribute

【讨论】:

  • 是的,这表明它在单个 cpu 上出现错误,但代码总是这样编译/解释吗?这不是编译器特有的行为,可能只适用于 intel 和 cpython 吗?
  • 我不确定处理器与它有什么关系,但你说得对,这在 cpython 以外的其他东西上可能会有所不同。
  • 那么 cpython 的编译方式可能会使其行为基于架构而有所不同。 - 语言规范中是否有正式的定义,它的行为应该像 xyz,还是设计未指定?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多