Julia中的append!和push!有什么区别?

8
在Julia中,你可以使用append!push!向现有的向量永久性地添加元素。例如:
julia> vec = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> push!(vec, 4,5)
5-element Vector{Int64}:
 1
 2
 3
 4
 5

# or

julia> append!(vec, 4,5)
7-element Vector{Int64}:
 1
 2
 3
 4
 5

但是,append!push!有什么区别呢?根据官方文档的推荐,应该使用push!来将单个项添加到不在另一个集合中的集合中。上面示例的结果等同于push!([1, 2, 3], 4, 5, 6)。这就是这两个函数之间的主要区别!但是,在上面的示例中,我使用append!将单独的元素添加到现有向量中。那么为什么他们建议在这些情况下使用push!呢?

与https://dev59.com/KlsW5IYBdhLWcg3woYgj相关的编程内容。 - jbytecode
@jbytecode,是的,但这并不是我的问题的答案!我问的是“为什么他们建议在这些情况下使用push!” - Shayan
2个回答

9

append!(v, x) 会迭代 x,并将x 的元素添加到 v 中。而 push!(v, x) 则会把整个的 x 添加到 v 的末尾。在你的示例中没有区别,因为在Julia中你可以迭代一个数字(它类似于一个长度为1的迭代器)。下面是一个更好的例子来说明差异:

julia> v = Any[]; # Intentionally using Any just to show the difference

julia> x = [1, 2, 3]; y = [4, 5, 6];

julia> push!(v, x, y);

julia> append!(v, x, y);

julia> v
8-element Vector{Any}:
  [1, 2, 3]
  [4, 5, 6]
 1
 2
 3
 4
 5
 6

在这个例子中,当使用push!时,xy成为v的元素,但当使用append!时,xy元素成为v的元素。

官方文档说:“使用push!将单个项添加到集合中,这些项本身不在另一个集合中。”这意味着建议在这种情况下使用push!而不是append!!这就是为什么我有意提供了那些例子来展示在那些情况下,append!同样有效!但是为什么他们建议使用push!呢?毕竟,我明白你的意思了!非常感谢! - Shayan
@fredrikekre 请添加有关未经类型定义的容器的注释,否则其他人将使用您的代码来学习Julia,并抱怨它的速度慢;) - Przemyslaw Szufel
当然,我已经更新了示例。 - fredrikekre
所以本质上,在将x和y添加到一个标量列表v之前,它会展平它们。 - user3180

-4

由于Julia仍处于早期阶段,最好遵循社区标准之一,即您的代码在第一眼看上去是否“有意义” - 我应该立即知道您的“意图”。

关于append!,文档中说:

“对于有序容器集合,请将每个集合的元素添加到其末尾。!!! compat“Julia 1.6”指定要附加的多个集合需要至少Julia 1.6。”

添加了append!方法,并且需要Julia 1.6才能用于多个集合;因此,在某种程度上,随着Julia被广泛采用,它将成为未来要使用的方法,Python也使用它,因此从那里采用者可能也会使用它。

关于push!,文档中说:

“在集合中插入一个或多个项目。如果集合是有序容器,则按给定顺序将项目插入末尾。如果集合是有序的,请使用append!将另一个集合的所有元素添加到其中。”

文档建议在集合有序时使用"append!"而非"push!"。所以作为Julia用户,如果我看到你的代码中使用了append!,我应该知道它所作出的更改是基于某种方式上是有序的。这就是全部内容。否则,push!和append!所做的事情是相同的(可能在未来会发生变化),但请遵循社区标准,这将有所帮助。

因此,在关注集合顺序时,请使用append!;而在不关注顺序时,请使用push!。这样,任何阅读您代码的Julia用户都能立即了解您的意图;但请勿混淆它们。


等等,这个答案有一些问题... append!push! 在 Julia 1.6 之前就已经存在了,并且顺序没有任何关系。对于集合来说,append! 添加集合的元素,push! 则将整个集合添加进去,仅此而已。 - Antonello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接