标签: shallow-copy

754
推荐指数
22
解决办法
55万
查看次数

如何在PHP中创建对象的副本?

看来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)

在两个印刷案例中,我都在"追求"

那么,我如何通过值传递$ aset_b(),而不是通过引用?

php clone copy shallow-copy

151
推荐指数
5
解决办法
11万
查看次数

为什么以及何时使用angular.copy?(深拷贝)

我一直在将从服务接收的所有数据直接保存到本地变量,控制器或范围.我认为会被认为是浅层副本,这是正确的吗?

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)是否有特定的好处,你可以向我解释一下吗?

javascript deep-copy shallow-copy angularjs

133
推荐指数
3
解决办法
18万
查看次数

在Java中的地图的浅拷贝

据我了解,有几种方法(也许还有其他方法)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)

java clone map shallow-copy

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

在C#中进行浅拷贝的最快方法

我想知道在C#中进行浅层复制的最快方法是什么?我只知道有两种方法可以做浅拷贝:

  1. MemberwiseClone
  2. 逐个复制每个字段(手动)

我发现(2)比(1)快.我想知道是否还有另一种方法可以进行浅层复制?

c# shallow-copy cloning

54
推荐指数
6
解决办法
5万
查看次数

在Java中,什么是浅拷贝?

java.util.Calendar.clone()返回"...具有相同属性的新日历"并返回"此日历的浅表副本".

为回答这并不似乎是一个浅拷贝这里的SO.这个问题被标记为与语言无关, Java似乎不遵循语言无关的定义.当我单步执行代码时,我注意到结构和元素被复制到这个新对象,而不仅仅是语言无关的结构.

在Java中,什么是浅拷贝?

它与Java深层副本(如果存在)有何不同?

java clone shallow-copy

51
推荐指数
3
解决办法
8万
查看次数

如何在Python中克隆或复制集合?

复制列表:shallow_copy_of_list = old_list[:].

复制词典:shallow_copy_of_dict = dict(old_dict).

但是对于a set,我担心类似的东西不起作用,因为说new_set = set(old_set)会给出一套一套?

但它确实有效.所以我在这里发布问题和答案以供参考.如果其他人有同样的困惑.

python clone set shallow-copy

48
推荐指数
2
解决办法
4万
查看次数

我应该何时通过值传递或返回结构?

结构可以通过值传递/返回,也可以通过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是一个大型结构:

https://github.com/torvalds/linux/blob/b953c0d234bc72e8489d3bf51a276c5c4ec85345/include/linux/sched.h#L1292-1727

我们希望不惜一切代价避免使用堆栈(特别是那些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)

确定结构是否足够小以确定是否可以安全地通过值传递(缺少某些深度递归等情有可原的情况),最好的经验法则是什么?

最后请不要告诉我需要个人资料.当我太懒的时候,我要求使用启发式方法/它不值得进一步调查.

编辑:到目前为止,根据答案我有两个后续问题:

  1. 如果结构实际上小于指向它的指针怎么办? …

c shallow-copy

42
推荐指数
5
解决办法
1万
查看次数

JS:Object.assign()是否创建深拷贝或浅拷贝

我刚刚遇到了这个概念

var copy = Object.assign({}, originalObject);
Run Code Online (Sandbox Code Playgroud)

它会将原始对象的副本创建到" copy"对象中.但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?

PS:令人困惑的是,如果它创建了一个深层副本,那么它将是克隆一个对象的最简单方法.

javascript object deep-copy shallow-copy

40
推荐指数
5
解决办法
2万
查看次数

默认赋值运算符=在c ++中是浅拷贝?

只是一个简单的快速问题,我无法找到其他任何地方的可靠答案.默认运算符=只是右侧所有类成员的浅表副本吗?

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)

当我测试它时,这似乎是真的,但我需要确定我没有错过某些特定情况.

c++ operators shallow-copy

38
推荐指数
5
解决办法
3万
查看次数

标签 统计

shallow-copy ×10

clone ×4

deep-copy ×3

copy ×2

java ×2

javascript ×2

angularjs ×1

c ×1

c# ×1

c++ ×1

cloning ×1

language-agnostic ×1

map ×1

object ×1

operators ×1

php ×1

python ×1

set ×1