小编Vro*_*del的帖子

大多数pythonic和/或performant方式将单个值分配给切片?

我想为列表的一部分分配一个值.除了以下之一之外,还有更好的解决方案吗?

也许性能最好,但有些丑陋:

>>> l=[0,1,2,3,4,5]
>>> for i in range(2,len(l)): l[i] = None

>>> l
[0, 1, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

简洁(但我不知道Python是否认识到不需要重新排列列表元素):

>>> l=[0,1,2,3,4,5]
>>> l[2:] = [None]*(len(l)-2)
>>> l
[0, 1, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

同样的警告如上:

>>> l=[0,1,2,3,4,5]
>>> l[2:] = [None for _ in range(len(l)-2)]
>>> l
[0, 1, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

不确定是否使用库来执行这样一个简单的任务是明智的:

>>> import itertools
>>> l=[0,1,2,3,4,5]
>>> l[2:] = itertools.repeat(None,len(l)-2)
>>> l
[0, 1, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

我看到切片的赋值(对于for循环)的问题是Python可能会尝试准备"l"长度的变化.毕竟,通过插入更短/更长的切片来更改列表涉及复制列表AFAIK的所有元素(即所有引用).如果Python也在我的情况下这样做(虽然没有必要),操作变为O(n)而不是O(1)(假设我只是总是改变一些元素).

python slice

16
推荐指数
3
解决办法
626
查看次数

C/C++ 联合和未定义的行为

以下是未定义的行为吗?

 union {
   int foo;
   float bar;
 } baz;

 baz.foo = 3.14 * baz.bar;
Run Code Online (Sandbox Code Playgroud)

我记得在两个序列点之间从同一底层内存进行写入和读取是UB,但我不确定。

c c++ undefined-behavior unions language-lawyer

8
推荐指数
1
解决办法
910
查看次数

Python:分配"通过"迭代器

我有一个可变序列的迭代器,例如

foo = [1,2,3,4,5]
for bar in foo:
Run Code Online (Sandbox Code Playgroud)

有没有办法通过使用迭代器中包含的引用来写入foo中的元素?天真的任务:

   bar = 42
Run Code Online (Sandbox Code Playgroud)

当然不起作用.是否可以使用"幕后"引用迭代器中的序列元素?

PS:使用索引的简单解决方案

for i in range(len(a)):
   a[i] = 42
Run Code Online (Sandbox Code Playgroud)

不适用于我的情况,因为我无法公开容器名称.

python iterator reference variable-assignment

7
推荐指数
3
解决办法
9858
查看次数

ARM 单拷贝原子性

我目前正在费力地阅读 ARMv7 内核的 ARM 架构手册。在关于内存访问原子性的章节 A3.5.3 中,它指出:

如果单副本原子加载与单副本原子存储重叠,并且对于任何重叠字节,加载返回由单副本原子存储插入到该字节的一致性顺序中的写入写入的数据,则加载必须返回来自一致性顺序中的某个点的数据不早于由所有重叠字节的单副本原子存储插入一致性顺序的写入。

作为非英语母语人士,我承认我在理解这句话时遇到了一些挑战。

是否存在对内存字节的写入未插入一致性顺序因此上述情况不适用的情况?如果不是,我的说法是否正确,将句子缩短并改写为以下内容:

如果加载恰好返回写入的至少一个字节,则加载必须从不早于写入将它们插入所有重叠字节的一致性顺序的点返回所有重叠字节。

仍然传达相同的含义吗?

memory arm atomic cortex-a

3
推荐指数
1
解决办法
4613
查看次数

是否有可用作谓词的 std:: 函数(类似于 std::is_null_ptr)?

我本来希望有一个简短、简洁、优雅的:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),std::is_null_ptr_as_fn);
Run Code Online (Sandbox Code Playgroud)

而不是为此目的发明 lambda:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),[](int *ip){ return ip == nullptr;});
Run Code Online (Sandbox Code Playgroud)

这甚至可能是可疑的,因为我忽略了它std::is_null_ptr,它应该读成这样:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),[](int *ip){ std::is_null_ptr r(ip); return r();});
Run Code Online (Sandbox Code Playgroud)

恶心。

c++ null-pointer

1
推荐指数
1
解决办法
250
查看次数

ARM如何从SD卡启动?

关于来自串行闪存设备的现代系统的启动概念,我有点迷失.在裸机上编程了大量简单的微控制器,从8位PIC到32位Power架构(总是通过重新编程正常的总线可寻址闪存),我想知道现代SoC如何从串行设备启动.我没有在网上找到太多,因为每个系统似乎都依赖于SD卡编程工具和辅助引导程序的组合,这两者都很少得到关注.

boot arm bootloader system-on-chip

0
推荐指数
1
解决办法
713
查看次数