鉴于比雷埃夫斯对另一个问题的回答,我们有这个
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
Run Code Online (Sandbox Code Playgroud)
True在启用哈希随机化的情况下打印大约85%的时间.为什么85%?
今天在编写一些特别糟糕的代码时,我偶然发现了这种神秘的行为.下面的Python 3程序打印随机选择的属性object.这是怎么发生的?
对于非确定性的一个明显的怀疑是vars(object)字典的随机排序,但我看不出它是如何导致观察到的行为.我得到的一个假设是,它是由__setattr__被覆盖的顺序引起的,但是lambda总是只被调用一次(通过打印调试检查)这一事实证明了这一点.
class TypeUnion:
pass
class t:
pass
def super_serious(obj):
proxy = t()
for name, val in vars(object).items():
if not callable(val) or type(val) is type:
continue
try:
setattr(t, name, lambda _, *x, **y: val)
except AttributeError:
pass
return proxy
print(super_serious(TypeUnion()).x)
Run Code Online (Sandbox Code Playgroud)
注意:上述程序并未试图做任何有用的事情; 它比原来大大减少了.
很抱歉,如果这是一个基本问题,但我试图了解set类型如何在python中工作
来自docs:
set对象是不同的可哈希对象的无序集合.
作为无序集合,集合不记录元素位置或插入顺序.
但如果它们是无序的,为什么我在这个测试中总是获得相同的顺序?我期待一些随机的顺序.
users_ids = set([1, 1, 2, 3])
>>> print users_ids
set([1, 2, 3])
Run Code Online (Sandbox Code Playgroud) 我出于好奇而问这个问题(具体来说,深入了解python是如何工作的).
我完全知道python dict对象是无序的 - 你可以放入一堆项目,并打印出一些表示dict,并且表示中项目的顺序将与输入项目的顺序无关.
然而,令我好奇的是,为什么顺序从一次执行代码变为另一次?
我有一个非常简单的python脚本,正在打印dict到控制台.字典看起来像这样(内容非常相关):
{
'hello': 'hi',
'goodbye': 'bye',
'hahaha': 'lol',
}
Run Code Online (Sandbox Code Playgroud)
将其打印到控制台会导致项目不仅以随机顺序打印,而且每次运行程序时都以不同的顺序打印.这是我的问题:为什么会这样?
注意:python代码在django项目中(但在这种情况下我没有使用任何django功能 - 只是提到它以防它以某种方式相关).
result = {}
a = ["a","b","c"]
b = [1, 2, 3]
for i in range(3):
result[a[i]] = b[i]
print result
Run Code Online (Sandbox Code Playgroud)
我希望得到以下结果: {'a': 1, 'b': 2, 'c': 3}
但真正的是 {'a': 1, 'c': 3, 'b': 2}
是什么原因以及如何解决?