4

<<=和运算符是什么|=意思 Python?我猜他们是按位运算符。我知道运算符|(按位或)和<<(位移位),但我不知道它们与=.

我在这段代码中找到了它。下面的代码属于该代码。

commandout = adcnum
commandout |= 0x18  # start bit + single-ended bit
commandout <<= 3    # we only need to send 5 bits here
for i in range(5):
    if (commandout & 0x80):
        GPIO.output(mosipin, True)
    else:
        GPIO.output(mosipin, False)
    commandout <<= 1
    GPIO.output(clockpin, True)
    GPIO.output(clockpin, False)
4

2 回答 2

8

两者都是就地分配;它们有效地为您name = name op right-hand-expression提供公正的空间name op= right-hand-expression

因此,对于您的示例,您可以将其解读为:

commandout = commandout | 0x18
commandout = commandout << 3

这有点过于简单化了,因为这些操作有专门的钩子,左边的对象可以选择做一些特别的事情;list += rhs真的list.extend(rhs)是例如,不是list = list + rhs。就地运算符为可变对象提供了应用更改self而不是创建新对象的机会。

但是,对于您的示例,我假设commandout是一个 int,您有不可变的值,并且就地操作必须返回一个新值。

于 2013-04-06T13:36:49.400 回答
2

这些是到位的位算术运算符。他们使用与 C 相同的样式运算符修改 LH 值(如果 lh 是不可变的,则将 lh 值重新分配为新的计算值)。

Python 称它们为移位运算符( <<and >>) 和二进制位运算符( &, ^and |)。

添加=after 运算符后,赋值返回到原来的 LH 名称,|=原地左移or<<=原地左移也是如此。

所以x<<=3等于x=x<<3或将 x 位左移 3 位的值。

位移:

>>> b=0x1
>>> b<<=3
>>> bin(b)
'0b1000'

>>> b>>=2
>>> bin(b)
'0b10'

位或:

>>> bin(b)
'0b1'
>>> bin(c)
'0b100'
>>> c|=b
>>> bin(c)
'0b101'

从技术上讲,如果 LH 值是不可变的,则结果将反弹到 LH 名称,而不是值的实际就地转换。

这可以通过检查项目的地址来显示:

>>> id(i)
4298178680       # original address (in CPython, id is the address)
>>> i<<=3
>>> id(i)
4298178512       # New id; new int object created

与使用 C 不同(在本例中为ctypes):

>>> import ctypes
>>> i=ctypes.c_int(1)
>>> ctypes.addressof(i)
4299577040
>>> i.value<<=3
>>> ctypes.addressof(i)
4299577040

由于 C 整数是可变的,因此位移是在没有 C int 的新地址的情况下完成的。

于 2013-04-06T13:37:02.463 回答