添加没有任何指针或引用的列表

时间:2016-12-28 10:42:32

标签: python list

我在使用Python方面遇到了一些麻烦,我知道在其他语言中,你所做的一切都非常直接且非常符合逻辑。但是,在Python中,appending list datalistcopy.copy(list[:])只需保留引用或指针,因此,任何在新列表中显示对原始列表所做的更改。

我听说过list_1 = [1, 2, 3] new_list = [] new_list.append(list_1[:]) ,但我并不是100%肯定这会很好用。

>>> list_1.append(4)

>>> print list_1
[1, 2, 3, 4]

>>> print new_list
[1, 2, 3, 4]

但是,如果您修改 list_1 ,则还会修改 new_list ,因为它们指向同一列表。

append

所有这些对我来说真的很烦人。如果有人知道更好的方法,请告诉我。

我希望能够对 list_1 进行更改并继续new_list [0] >>> [1, 2, 3, 4] [1] >>> [5, 6, 7, 8] new_list ,以便填充 new_list < / strong>像这样:

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> list_1 = [1,2,3]
>>> new_list = []
>>> new_list.append(list_1[:])
>>> print new_list
SyntaxError: Missing parentheses in call to 'print'
>>> print(new_list)
[[1, 2, 3]]
>>> list_1.append(4)
>>> print(new_list)
[[1, 2, 3]]
>>> print(new_list)
[[1, 2, 3]]
>>> print(list_1)
[1, 2, 3, 4]

有时第一个列表也可能比此示例所声称的更大。

立即进行测试:

[RoutePrefix("BeaufortAppStore/api/Image")]
public class ImageController : ApiController
{

    #region Methods

    #region Posts

    [Route("UploadImage")]
    [HttpPost]
    public async Task<IHttpActionResult> UploadImage()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        var provider = new MultipartMemoryStreamProvider();

        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
        MemoryStream tempStream = new MemoryStream();
        reqStream.CopyTo(tempStream);

        tempStream.Seek(0, SeekOrigin.End);
        StreamWriter writer = new StreamWriter(tempStream);
        writer.WriteLine();
        writer.Flush();
        tempStream.Position = 0;

        StreamContent streamContent = new StreamContent(tempStream);
        foreach (var header in Request.Content.Headers)
        {
            streamContent.Headers.Add(header.Key, header.Value);
        }

        // Read the form data and return an async task.
        await streamContent.ReadAsMultipartAsync(provider); // FAILS AT THIS POINT
        foreach (var file in provider.Contents)
        {
            var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
            var buffer = await file.ReadAsByteArrayAsync();
            //Do whatever you want with filename and its binary data.
        }
        return Ok();
    }

    #endregion

    #endregion

奇怪。奇怪。奇怪。

1 个答案:

答案 0 :(得分:-2)

在Python中,任何复杂对象总是由其引用表示。我认为不是boolintfloatNoneType和其他基本数据类型。这就是为什么两个引用可能指向一个对象,并且使用一个引用的任何修改将导致在另一个引用中显示相同的更改:

>>> lst = [1, 2]
>>> lst2 = lst
>>> lst.append(3)
>>> lst2
[1, 2, 3]

如果你想拥有两个不同的对象,你应该克隆第一个对象。可以copy.copycopy.deepcopy完成,具体取决于您的实际需求:

>>> import copy
>>> lst = [1, 2]
>>> lst2 = copy.copy(lst)
>>> lst.append(3)
>>> lst
[1, 2, 3]
>>> lst2
[1, 2]