在 PHP 中,可以通过以下方式将一个变量的变量值复制到另一个变量:
$copy = clone $original;
这不是询问有关 PHP 的问题的地方,但我误解了为什么clone
在那里添加这个词有帮助,即为什么不只写$copy = $original
,也许与 Bash 的比较(如果适用)可以帮助我理解原因。
答案1
我知道这种克隆(复制)可以防止对 Y 的更改影响 X 的原始值。
在 Bash 中这样做的方法是什么?
我对 PHP 不太熟悉,但我猜你想避免在 Python 中出现这样的情况:
>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 9
>>> b
[1, 9, 3]
>>> a
[1, 9, 3]
这里,创建了一个包含三个数字的列表,在赋值之后b = a
,两个名称都引用同一个列表,因此更改一个会更改另一个。
这样的情况在 Bash 中实际上是不可能的,因为没有隐式引用,也没有几乎任何对象可言。如果想要引用变量,则需要显式使用declare -n
/typeset -n
来创建 nameref 变量,或者使用${!p}
间接引用。
另外,您甚至不能像这样复制数组,仅通过引用数组名称,您需要逐个元素地执行此操作。如果a
是 Bash 中的数组,$a
则仅获取索引 0 处的元素:
$ a=(1 2 3)
$ b=$a
$ declare -p b
declare -- b="1"
赋值后,b
只是一个值为 的标量(非数组)变量1
。
您可以像这样复制数组:
$ a=(1 2 3)
$ b=("${a[@]}")
$ declare -p b
declare -a b=([0]="1" [1]="2" [2]="3")
这只是复制值并用它们创建一个新数组。 (根据我收集的信息,类似于b=[*a]
Python,也可能类似于 PHP 。)另外,正如评论中提到的,它会忘记原始索引,如果数组是稀疏的或关联的,这很重要。clone
看基于另一个关联数组创建关联数组