看来PHP对象是通过引用传递的.甚至赋值运算符似乎也没有创建Object的副本.
这是一个简单,人为的证明:
<?php
class A {
public $b;
}
function set_b($obj) { $obj->b = "after"; }
$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.
set_b($a);
print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'
?>
Run Code Online (Sandbox Code Playgroud)
在两个印刷案例中,我都在"追求"
那么,我如何通过值传递$ a到set_b(),而不是通过引用?
我一直在将从服务接收的所有数据直接保存到本地变量,控制器或范围.我认为会被认为是浅层副本,这是正确的吗?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Run Code Online (Sandbox Code Playgroud)
最近我被告知使用angular.copy来创建一个深拷贝.
$scope.example = angular.copy(response.data);
Run Code Online (Sandbox Code Playgroud)
但是,深度复制信息似乎在我的Angular应用程序使用时以相同的方式工作.使用深层复制(angular.copy)是否有特定的好处,你可以向我解释一下吗?
据我了解,有几种方法(也许还有其他方法)Map在Java中创建一个浅表副本:
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;
// first way
shallowCopy = new HashMap<String, Object>(data);
// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();
Run Code Online (Sandbox Code Playgroud)
一种方式优于另一种方式,如果是这样,为什么?
值得一提的是,第二种方式是"Unchecked Cast"警告.所以你必须添加@SuppressWarnings("unchecked")以解决它,这有点刺激(见下文).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
Run Code Online (Sandbox Code Playgroud) 我想知道在C#中进行浅层复制的最快方法是什么?我只知道有两种方法可以做浅拷贝:
我发现(2)比(1)快.我想知道是否还有另一种方法可以进行浅层复制?
java.util.Calendar.clone()返回"...具有相同属性的新日历"并返回"此日历的浅表副本".
为回答这并不似乎是一个浅拷贝这里的SO.这个问题被标记为与语言无关, Java似乎不遵循语言无关的定义.当我单步执行代码时,我注意到结构和元素被复制到这个新对象,而不仅仅是语言无关的结构.
在Java中,什么是浅拷贝?
它与Java深层副本(如果存在)有何不同?
复制列表:shallow_copy_of_list = old_list[:].
复制词典:shallow_copy_of_dict = dict(old_dict).
但是对于a set,我担心类似的东西不起作用,因为说new_set = set(old_set)会给出一套一套?
但它确实有效.所以我在这里发布问题和答案以供参考.如果其他人有同样的困惑.
结构可以通过值传递/返回,也可以通过C中的引用(通过指针)传递/返回.
普遍的共识似乎是,在大多数情况下,前者可以适用于没有惩罚的小结构.请参阅是否存在直接返回结构的良好做法?和是否有任何缺点由值用C传递结构,而不是传递指针?
从速度和清晰度的角度来看,避免取消引用可能是有益的.但什么算小?我想我们都同意这是一个小结构:
struct Point { int x, y; };
Run Code Online (Sandbox Code Playgroud)
我们可以通过相对有罪不罚的价值来传递:
struct Point sum(struct Point a, struct Point b) {
return struct Point { .x = a.x + b.x, .y = a.y + b.y };
}
Run Code Online (Sandbox Code Playgroud)
那个Linux task_struct是一个大型结构:
我们希望不惜一切代价避免使用堆栈(特别是那些8K内核模式堆栈!).但是什么是中等的?我假设小于寄存器的结构是好的.但那些呢?
typedef struct _mx_node_t mx_node_t;
typedef struct _mx_edge_t mx_edge_t;
struct _mx_edge_t {
char symbol;
size_t next;
};
struct _mx_node_t {
size_t id;
mx_edge_t edge[2];
int action;
};
Run Code Online (Sandbox Code Playgroud)
确定结构是否足够小以确定是否可以安全地通过值传递(缺少某些深度递归等情有可原的情况),最好的经验法则是什么?
最后请不要告诉我需要个人资料.当我太懒的时候,我要求使用启发式方法/它不值得进一步调查.
编辑:到目前为止,根据答案我有两个后续问题:
如果结构实际上小于指向它的指针怎么办? …
我刚刚遇到了这个概念
var copy = Object.assign({}, originalObject);
Run Code Online (Sandbox Code Playgroud)
它会将原始对象的副本创建到" copy"对象中.但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?
PS:令人困惑的是,如果它创建了一个深层副本,那么它将是克隆一个对象的最简单方法.
只是一个简单的快速问题,我无法找到其他任何地方的可靠答案.默认运算符=只是右侧所有类成员的浅表副本吗?
Class foo {
public:
int a, b, c;
};
foo f1, f2;
...
f1 = f2;
Run Code Online (Sandbox Code Playgroud)
将与以下内容相同:
f1.a = f2.a;
f1.b = f2.b;
f1.c = f2.c;
Run Code Online (Sandbox Code Playgroud)
当我测试它时,这似乎是真的,但我需要确定我没有错过某些特定情况.