Переменные PHP передаются значением или ссылкой?

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

. Для одного значения наиболее простым (читаемым человеком), вероятно, является:

df.loc[df['column_name'] == some_value]

Для списков значений вы также можете использовать:

df.loc[df['column_name'].isin(some_values)]

Например,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
               'B': 'one one two three two two one three'.split(),
               'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

дает

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Если у вас есть несколько критериев, которые вы хотите выбрать, вы можете поместить их в список и использовать 'isin':

print(df.loc[df['B'].isin(['one','three'])])

дает

      A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Обратите внимание, однако, что если вы хотите сделать это много раз, более эффективно сделать A сначала индекс, а затем используйте df.loc:

df = df.set_index(['A'])
print(df.loc['foo'])

дает

  A      B  C   D
foo    one  0   0
foo    two  2   4
foo    two  4   8
foo    one  6  12
foo  three  7  14
227
задан hichris123 24 May 2014 в 14:52
поделиться

9 ответов

Это значением согласно Документация PHP .

По умолчанию, аргументы функции передаются значением (так, чтобы, если значение аргумента в функции изменяется, это не становилось измененным за пределами функции). Чтобы позволить функции изменять свои аргументы, они должны быть переданы ссылкой.

Для имения аргумента функции, всегда передаваемой ссылкой, предварительно ожидайте амперсанд ( & ) к имени аргумента в функциональном определении.

<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}

$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>
288
ответ дан Prabu Guna 23 November 2019 в 03:48
поделиться

Зависит от версии, 4 значением, 5 ссылкой.

-7
ответ дан Karl Seguin 23 November 2019 в 03:48
поделиться

Переменные, содержащие типы примитивов, передаются значением в PHP5. Переменные, содержащие объекты, передаются ссылкой. Существует вполне интересная статья из Журнала Linux с 2006, который упоминает это и другие различия OO между 4 и 5.

http://www.linuxjournal.com/article/9170

5
ответ дан Polsonby 23 November 2019 в 03:48
поделиться

Переменные PHP присвоены значением, переданным функциям значением, и когда содержащий/представляющий объекты передаются ссылкой. Можно вынудить переменные передать ссылкой с помощью &

Присвоенный значением/справочным примером:

$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";

print ("var1: $var1, var2: $var2, var3: $var3);

произвел бы

var1: тест, var2: завершающее испытание, var3: завершающее испытание

Переданный значением/ссылкой exampe:

$var1 = "foo";
$var2 = "bar";

changeThem($var1, $var2);

print "var1: $var1, var2: $var2";

function changeThem($var1, &$var2){
    $var1 = "FOO";
    $var2 = "BAR";
}

произвел бы:

var1: нечто, var2 ПАНЕЛЬ

Переменные объекта, переданные ссылкой exampe:

class Foo{
    public $var1;

    function __construct(){
        $this->var1 = "foo";
    }

    public function printFoo(){
        print $this->var1;
    }
}


$foo = new Foo();

changeFoo($foo);

$foo->printFoo();

function changeFoo($foo){
    $foo->var1 = "FOO";
}

произвел бы:

НЕЧТО

(что последний пример мог быть лучше, вероятно...)

25
ответ дан anju 23 November 2019 в 03:48
поделиться

http://www.php.net/manual/en/migration5.oop.php

В PHP 5 существует новая Объектная модель. Обработка PHP объектов была полностью переписана, допуская лучшую производительность и больше функций. В предыдущих версиях PHP объекты были обработаны как типы примитивов (например, целые числа и строки). Недостаток этого метода состоял в том, что семантически целый объект был скопирован, когда переменная была присвоена или передана в качестве параметра методу. В новом подходе на объекты ссылается дескриптор, а не значением (можно думать о дескрипторе как об идентификаторе объекта).

30
ответ дан Karl Seguin 23 November 2019 в 03:48
поделиться

Кажется, что много людей запутывается способом, которым объекты передаются функциям и что передача ссылочными средствами. Переменные объекта все еще передаются значением, его просто значение, которое передается в PHP5, является ссылочным дескриптором. Как доказательство:

<?php
class Holder {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return $this->value;
    }
}

function swap($x, $y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

Выводы:

a, b

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

<?php
function swap(&$x, &$y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

Выводы:

b, a

для передачи ссылкой.

59
ответ дан guitarlass 23 November 2019 в 03:48
поделиться

Можно сделать это так или иначе.

помещает '&'; символ впереди и переменная, Вы являетесь передающими, становятся одними и теми же как свой источник. т.е.: можно передать ссылкой, вместо того, чтобы делать копию из него.

так

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
6
ответ дан Bingy 23 November 2019 в 03:48
поделиться

Объекты пропускаются посредством ссылки в PHP 5 и по значению в PHP 4. Переменные передаются по значению по умолчанию!

Читайте здесь: http://www.webeks.net/programming/php/appersand-operator-used-formizonsigning-Reference.html

1
ответ дан 23 November 2019 в 03:48
поделиться
class Holder
{
    private $value;

    public function __construct( $value )
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setValue( $value )
    {
        return $this->value = $value;
    }
}

class Swap
{       
    public function SwapObjects( Holder $x, Holder $y )
    {
        $tmp = $x;

        $x = $y;

        $y = $tmp;
    }

    public function SwapValues( Holder $x, Holder $y )
    {
        $tmp = $x->getValue();

        $x->setValue($y->getValue());

        $y->setValue($tmp);
    }
}


$a1 = new Holder('a');

$b1 = new Holder('b');



$a2 = new Holder('a');

$b2 = new Holder('b');


Swap::SwapValues($a1, $b1);

Swap::SwapObjects($a2, $b2);



echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";

echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";

Атрибуты все еще можно изменять, если они не передаются по ссылке, поэтому будьте осторожны.

Выход:

Поменяйте местами объекты: b, a SwapValues: a, b

1
ответ дан 23 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

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