- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题表面上看起来像是重复的,但它不是关于通常的 mutable surprise带有列表。
稍后会详细介绍,但简而言之,就在
self.facts = facts
print("facts: ", id(facts))
print("self.facts: ", id(self.facts))
有时 self.facts
和 facts
并不相同。
app是单线程的,区别还是有的,所以它不是似乎是竞争条件或缓冲区延迟。
我确实清除了缓存:找到。 -name "*.pyc"-delete
我试着想出一个 mcve ,但无法重现错误。这是一个尝试。
class Fact():
def __init__(self, a):
self.a = a
def __eq__(self, other):
return self.a == self.b
facts1 = [Fact(1), Fact(2), Fact(3)]
id(facts1)
facts2 = facts1
id(facts2)
# same as facts1
facts3 = [Fact(1), Fact(2), Fact(3)]
id(facts3)
facts2 = facts3
id(facts2)
# same as fact3, as it should
可以在 this issue 中找到快照和重现步骤.
只要 __eq__
是 expanded还要检查确实发生变化的字段,facts
和 self.facts
都包含相等的元素(在 __eq__
的意义上),非常好足够,但不完全相同,这仍然很奇怪。
这是已知的吗?这是我的 python 版本:
Python 3.6.5 (default, Mar 31 2018, 19:45:04) [GCC] on linux
on openSUSE Leap 15.0
可能会发生什么?
最佳答案
这种行为可能是由许多因素引起的,所有因素都控制如何访问对象的属性。从这个意义上说,self.x = y
与 x = y
有很大不同。前者尝试用 y
设置属性 "x"
在对象 self
上,而后者将名称 "x"
绑定(bind)到本地范围内的对象 y
。
Descriptors可以控制属性如何通过定义特殊方法 __get__
, __set__
, __delete__
来处理。一个例子:
from copy import copy
class Descriptor:
def __get__(self, obj, cls):
return copy(self.list_obj) # Return a copy -> id changes.
def __set__(self, obj, val):
self.list_obj = copy(val) # Store a copy -> id changes.
class Foo:
facts = Descriptor()
facts = [1, 2, 3]
obj = Foo()
obj.facts = facts
assert id(obj.facts) != id(facts) # ids are different.
property
可能是最突出的使用场景之一数据描述符。因此工作原理非常相似:
from copy import copy
class Foo:
@property
def facts(self):
return copy(self._facts) # Return a copy -> id changes.
@facts.setter
def facts(self, val):
self._facts = copy(val) # Store a copy -> id changes.
facts = [1, 2, 3]
obj = Foo()
obj.facts = facts
assert id(obj.facts) != id(facts) # ids are different.
__getattr__
和 __setattr__
通过定义方法 __getattr__
和 __setattr__
一个类可以控制属性访问它的实例。例如:
from copy import copy
class Foo:
def __getattr__(self, name):
return copy(super().__getattr__(name)) # Return a copy -> id changes.
def __setattr__(self, name, val):
super().__setattr__(name, copy(val)) # Store a copy -> id changes.
facts = [1, 2, 3]
obj = Foo()
obj.facts = facts
assert id(obj.facts) != id(facts) # ids are different.
您可以检查type(obj).facts
以查明facts
是否被定义为描述符。类似地,您可以检查 type(obj).__(get|set)attr__
以查看基类中是否定义了任何这种特殊的方法。这里值得注意的是,如果定义了上述任何方法,它也可以工作在方法解析顺序中的任何类(__mro__
,即父类)。所以你需要检查例如:
any('__getattr__' in vars(cls) for cls in type(obj).__mro__)
您链接的类继承自 this class它定义了 __setattr__
以它检查的方式对于具有现有值的相等(==
;不是同一性(是
)),如果它们比较相等则返回。这意味着如果你有两个比较相等的列表,即 self.facts == facts
,那么执行 self.facts = facts
只会返回而不设置属性。因此没有任何改变并且这两个对象(self.facts
和 facts
)仍然是不同的。代码基本上归结为:
class Foo:
def __setattr__(self, name, val):
if self.__dict__.get(name, None) == val: # Could also use `getattr(self, name, None)`.
return
super().__setattr__(name, val)
facts = [1, 2, 3]
obj = Foo()
obj.facts = [1, 2, 3]
assert obj.facts == facts # The two lists compare equal,
obj.facts = facts # hence nothing will happen here,
assert obj.facts == facts # they still compare equal,
assert id(obj.facts) != id(facts) # but are still two distinct objects.
关于python - 属性与前面的属性赋值操作的右侧值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393731/
似乎这是不可能的,但如果有人提示如何在谷歌浏览器中创建右侧边栏(如 iframe),任何提示都会有所帮助。谢谢。 最佳答案 如果你的意思是这样的 这是来自 google chrome 实验 api:
您好,我在用 C 语言解决编程任务时遇到问题。 The funktion "Trim" should replace all spaces at the end of a String with nu
有什么方法可以找到一个事件(或属性或方法或类似的东西)来检测窗口停靠到左侧或右侧吗? 描述: 通过 WindowState 属性,您可以了解当您的窗口在正常/最小化/最大化这三种状态之间改变状态时。在
我目前需要找到一个算法来确定一个点是在圆弧的右侧还是左侧。 这是以下算法的扩展以包含弧: // isLeft(): tests if a point is Left|On|Right of an i
我正在使用 Selenium 执行测试,该测试在 3 个浏览器上并行执行。我想以下一种方式定位 window :左侧,右侧和底部,所以基本上我正在寻找与 (start btn+left btn...)
如果我有下面的代码,并且我想插入一个带有 jquery 的 div 作为表单标记内的第一个元素,那么最好的方法是什么? //i want to insert a div here with
有没有比这个更好的方法来解决这个问题? def 渲染(arr): single_elements = [] double_elements = [] for i in xrange(len(arr
Home About
我遇到的问题是: www.dondolomemories.it 当调整窗口大小时, Logo 图像直到最后一刻才调整大小,导致可怕的两行菜单溢出。 我花了将近 2 个小时尝试大量不同的设置。有人可以帮
我希望我能很好地解释这一点。我有一个 style="float: right;"的 div在这个 div 中,我有一个包含一些编辑器字段的表。但现在我想要两个文本编辑器框(在 .NET MVC3 @H
如果有人能帮助我解决这个问题,我将不胜感激,因为我无法让它工作。 这是我正在努力处理的代码:http://jsfiddle.net/sp91c3nk/ 基本上,我希望右侧导航栏与灰色主要内容区域处于同
我正在尝试在图像的所有四个边上添加文本,但我无法让正确的文本正确对齐。右边的文字仍然在左边。 fiddle :https://jsfiddle.net/y75L0ww9/ Text on top Te
我正在尝试为顶部以及左侧和右侧设置 css 阴影,但高度降低。我熟悉模糊/半径,但我希望阴影非常短。 picture from wix template (还不能上传,抱歉) 有人可以帮帮我吗?我看到
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve
请看这个jsfiddle . 我想要 与 innerText “嗨!”始终出现在其包含父级的可见部分的底部/右侧。它不应与其父级的内容一起滚动。 HTML: Header
我有一个输入框和一个提交按钮。 当我向右浮动提交按钮时,我希望它在与输入字段相同的点结束 - 这是我的意思的一个例子:http://prntscr.com/aggln5 目前,输入和提交在不同的点结束
我基本上刚刚开始让我的网站响应,但出于某种原因,语言 div (#lang) 设置为向右浮动,正在向右浮动,但在它的右侧有一个小边距。虽然没有填充设置父 div #container,但我无法理解。
我目前正在创建一个网站,该网站有一个带有文本等内容的居中框。现在,我还想要一个漂浮在右边的盒子,与我的主盒子有一点缝隙。留个图吧,我画的红框就是我要制作的 float 框。 顺便说一句。蓝色方框只是我
我不是 UI 开发人员,但这次需要玩 css。为用户配置文件编写表单。我快完成了,但还有一个小问题。问题 个人资料图片未正确显示在右侧。 因此,第一个字段(组织名称)显示不正确 自从过去两个小时以来,
我有以下脚本: http://jsfiddle.net/rYFEY/12/ 效果很好,除了我需要移除右侧和右下角的 handle ,只留下底部 handle 用于调整大小。目前,如果我点击右 hand
我是一名优秀的程序员,十分优秀!