Странное поведение функции deepcopy в Python [duplicate]

Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.

Вот пример того же:

var async = require("async");

// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
    // some asynchronous operation
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;
            _callback();
        }
    });
});

async.parallel(asyncTasks, function(){
    // result is available after performing asynchronous operation
    console.log(result)
    console.log('Done');
});

Я использую объект result для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.

Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.

62
задан Peter Mortensen 22 November 2014 в 15:43
поделиться

2 ответа

Это специфично для реализации, но ваш интерпретатор, вероятно, интерполирует константы времени компиляции, но не результаты выражений во время выполнения.

В дальнейшем я использую CPython 2.7.3.

Во втором примере выражение "strin"+"g" оценивается во время компиляции и заменяется на "string". Это приводит к тому, что первые два примера ведут себя одинаково.

Если мы рассмотрим байт-коды, мы увидим, что они точно такие же:

  # s1 = "string"
  2           0 LOAD_CONST               1 ('string')
              3 STORE_FAST               0 (s1)

  # s2 = "strin" + "g"
  3           6 LOAD_CONST               4 ('string')
              9 STORE_FAST               1 (s2)

Третий пример включает в себя прогон -time concatenation, результат которого не будет автоматически интернирован:

  # s3a = "strin"
  # s3 = s3a + "g"
  4          12 LOAD_CONST               2 ('strin')
             15 STORE_FAST               2 (s3a)

  5          18 LOAD_FAST                2 (s3a)
             21 LOAD_CONST               3 ('g')
             24 BINARY_ADD          
             25 STORE_FAST               3 (s3)
             28 LOAD_CONST               0 (None)
             31 RETURN_VALUE        

Если вы должны вручную intern() получить результат третьего выражения, вы получите тот же объект, что и раньше:

>>> s3a = "strin"
>>> s3 = s3a + "g"
>>> s3 is "string"
False
>>> intern(s3) is "string"
True
67
ответ дан NPE 25 August 2018 в 18:47
поделиться

Случай 1

>>> x = "123"  
>>> y = "123"  
>>> x == y  
True  
>>> x is y  
True  
>>> id(x)  
50986112  
>>> id(y)  
50986112  

Случай 2

>>> x = "12"
>>> y = "123"
>>> x = x + "3"
>>> x is y
False
>>> x == y
True

Теперь, ваш вопрос заключается в том, почему идентификатор один и тот же в случае 1, а не в случае 2. В случае 1, вы назначили строковый литерал "123" на x и y.

Так как строка неизменяема, интерпретатор имеет смысл хранить строковый литерал только один раз и указывать все переменные на один и тот же объект. Следовательно, вы видите идентификатор как идентичный.

В случае 2 вы изменяете x с помощью конкатенации. И x, и y имеют одинаковые значения, но не идентичны. Оба указывают на разные объекты в памяти. Следовательно, они имеют разные id и is оператор, возвращенные False

0
ответ дан cppcoder 25 August 2018 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: